Problem of Singleton

class Database{
public:
virtual int get_population(const std::string& name)=0;
};
class SingletonDatabase: public Database{
SigletonDatabase(){
// ...
}
std::map<std::string, int> capitals;
public:
SingletonDatabase(SingletonDatabase const&)=delete;
void operator=(SigletonDatabase const&)=delete;
static SigneltonDatabase& get(){
static SigneltonDatabase db;
return db;
}
int get_population(const std::string& name) override{
return capitals[name];
}
};
// SigletonDatabase SigneltonRecordFinder
struct SigletonRecordFinder{
int total_population(std::vector<std::string> names){
int result=0;
for(auto& name: names) result+=SingletonDatabase::get().get_population(name);
return result;
}
};
싱글톤 구현에서 문제가 되는 부분은 다른 싱글턴 컴포턴트에서 또 다른 싱글턴을 사용할 때이다.

싱글톤 데이터베이스(SigletonDatabase)에 대한 명시적 의존성을 제거하기 위해,
데이터를 얻을 데이터베이스를 설정할 수 있는 ConfigurableRecordFinder 객체 정의
struct ConfigurableRecordFinder{
explicit ConfigurableRecordFinder(Database& db): db(db) {}
int total_population(std::vector<std::string> names){
int result=0;
for(auto& name: names) result+=db.get_population(name);
return result;
}
};
위의 ConfigurableRecordFinder는 싱글톤 클래스에 의존하는 대신 참조 변수 db를 사용한다.